<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>继承</title>
  </head>
  <body>
    <!-- 
      面向对象开发的 三大特征: 封装 继承 多态
      - 封装: 用{}把很多代码括起来,形成一个整体
      - 继承: 在JS中就是原型链特征, 自己没有到原型中找
     -->
    <script>
      var a = { name: 'MIKE', age: 33 }
      console.log(a)
      // 替换对象类型的原型
      // set:设置 prototype:原型  of: ...的
      Object.setPrototypeOf(a, Array.prototype)
      // 把 a 的原型, 换成 Array.prototype

      // 换原型的作用:
      function sum() {
        console.log('arguments:', arguments)
        // 想用数组的高阶函数: reduce 计算
        // arguments:的原型是 Object, 是伪数组, 没有高阶函数
        // 原型换成数组的
        Object.setPrototypeOf(arguments, Array.prototype)
        var t = arguments.reduce((total, value) => total + value, 0)
        console.log(t)
      }

      sum(12, 3, 23, 34, 45, 45, 6, 765)
    </script>

    <script>
      // 创建对象类型时, 指定其原型
      // create: 创建
      // 一个普通对象在创建时, 指定其原型是谁
      // new Array(); new Date(); -- 单一,专业
      // create: 万能方式
      var p = Object.create(Array.prototype)

      var p = Object.create(Date.prototype)

      p.age = 11
      p.sex = 33
      console.log(p)
    </script>

    <script>
      // JAVA中: 类也可以指定 父类(原型)
      class Father {
        constructor() {
          this.a = 3
        }

        show() {}
      }

      // extends: 继承 Father 类, Demo创建出的对象的原型, 就是Father创建的对象
      // 方法在原型中存储, 属性会存到顶层对象里, 即 show 和 a 的差异
      class Demo extends Father {}
      // 继承: 父的东西 都会 传递给子使用

      var d = new Demo()
      console.log(d)
    </script>
  </body>
</html>
